package write;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;

/**
 * @author ghp
 * @date 2023/1/24
 * @title
 * @description
 */
public class WriteExcel07 {
    public static void main(String[] args) {
        try {
//            new WriteExcel07().writeExcel03();
//            new WriteExcel07().writeBatch07();
            new WriteExcel07().writeBig07();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 07版本的Excel写入操作
     */
    public void writeExcel03() throws Exception {
        // 1、创建工作簿
        Workbook workbook = new XSSFWorkbook();
        // 2、创建工作表
        Sheet sheet = workbook.createSheet("07版本测试");

        // 第一行数据写入
        // 3、创建行（第一行）
        Row row11 = sheet.createRow(0);
        // 4、创建列（单元格）
        Cell cell11 = row11.createCell(0);
        // 5、写入数据（1，1）
        cell11.setCellValue("1.1");

        // 写入数据（1，2）
        Cell cell12 = row11.createCell(1);
        cell12.setCellValue("1.2");

        // 第二行数据写入
        // 写入数据（2，1）
        Row row21 = sheet.createRow(1);
        Cell cell21 = row21.createCell(0);
        cell21.setCellValue("2.1");

        // 写入数据（2，2）
        Cell cell22 = row21.createCell(1);
        cell22.setCellValue("2.2");

        // 6、通过IO流生成工作簿
        FileOutputStream fos = new FileOutputStream("D:/Test/test-07.xlsx");
        workbook.write(fos);

        // 7、关流
        fos.close();
        System.out.println("工作簿生成完毕！");

    }

    /**
     * 07版本的Excel批量写入
     */
    public void writeBatch07() throws Exception {
        // 开始时间
        long start = System.currentTimeMillis();
        // 创建工作簿
        Workbook workbook = new XSSFWorkbook();
        // 创建表
        Sheet sheet = workbook.createSheet("07版本测试");
        // 写入数据
        for (int i = 0; i < 65537; i++) {
            // 65536行
            Row row = sheet.createRow(i);
            for (int j = 0; j < 10; j++) {
                // 10列
                Cell cell = row.createCell(j);
                String value = (i+1)+"."+(j+1);
                cell.setCellValue(value);
            }
        }
        // 生成表
        FileOutputStream fos = new FileOutputStream("D:/Test/test-07.xlsx");
        workbook.write(fos);
        // 关流
        fos.close();
        System.out.println("工作簿生成完毕！");
        // 结束时间
        long end = System.currentTimeMillis();
        System.out.println("生成工作簿总共耗时: "+(end-start)/1000+"s");
    }

    /**
     * 07版本的Excel大数据写入
     */
    public void writeBig07() throws Exception {
        // 开始时间
        long start = System.currentTimeMillis();
        // 创建工作簿
        Workbook workbook = new SXSSFWorkbook(250); // 滑动窗口默认值为250
        // 创建表
        Sheet sheet = workbook.createSheet("07版本测试");
        // 写入数据
        for (int i = 0; i < 65537; i++) {
            // 65536行
            Row row = sheet.createRow(i);
            for (int j = 0; j < 10; j++) {
                // 10列
                Cell cell = row.createCell(j);
                String value = (i+1)+"."+(j+1);
                cell.setCellValue(value);
            }
        }
        // 生成表
        FileOutputStream fos = new FileOutputStream("D:/Test/test-07.xlsx");
        workbook.write(fos);
        // 关流
        fos.close();
        System.out.println("工作簿生成完毕！");
        // 结束时间
        long end = System.currentTimeMillis();
        System.out.println("生成工作簿总共耗时: "+(end-start)/1000+"s");
    }
}
